<?php

    require_once(dirname(__FILE__).'/../xml/xml.php');

    // подцепляем наш сайт к системе, для того, чтобы система могла работать с нами
    $mikron->Site = new mikron_site_ex();

    // класс сайта
    class mikron_site_ex
    {
        public $serverauth;
        public $lpu;
        public $sessionid = null;

        function __construct()
        {
            global $mikron;
            $mikron->Handlers->AddAuthorizationHandler('Authorize', $this);
            if(isset($_SESSION['sessionid']))
            {
                $this->sessionid = $_SESSION['sessionid'];
            }
        }

        public function Authorize($parameters)
        {
            global $mikron;
            require_once(dirname(__FILE__).'/../lpu.php');
            $this->lpu = new lpu_class();
            if($parameters instanceof T_USER)
            {
                foreach($this->lpu->items() as $lpuitem)
                {
                    $server = $lpuitem->server;
                    $name = $lpuitem->name;
                    $name2 = $lpuitem->name2;
                    try
                    {
                        $this->InitializeServer('0205', 'albert$$', $lpuitem);
                    }
                    catch(Exception $ex)
                    {
                        $mikron->Tools->GoToPage('/?incorrect');
                    }
                    break;
                }
            }
            return true;
        }

        private function InitializeServer($slogin, $spassword, $lpu)
        {
            $server = $lpu->server;
            $this->login = $slogin;
            $this->password = $spassword;
            $xml = CreateLoginXML($this->login, $this->password);
            try
            {
                ini_set('default_socket_timeout', 3);
                $soap = new SoapClient($server, array("connection_timeout" => 3));
            }
            catch(Exception $ex)
            {
                throw new Exception('Нет связи с сервером. Попробуйте зайти позже.');
            }
            // var_dump($soap->__getFunctions());
            // var_dump($soap->__getTypes()); 
            // $params = Array();
            $params["MethodName"] = 'authentification';
            $params['XML'] = $xml;
            $resp = $soap->Operation($params);
            if($resp->MethodName == 'error')
            {
                $_SESSION['error'] = $resp->XML;
                header('Location: error.php');
                exit;
            }
            $buf = $resp->XML;
            $buf = str_replace('encoding="utf-16"', 'encoding="utf-8"', $buf);
            if($this->parse_authentification_responce($buf))
            {
                $currlpu = $lpu;
                $_SESSION['soap'] = $soap;                
                $_SESSION['server'] = $currlpu->server;                
                $_SESSION['name'] = $currlpu->name;
                $_SESSION['name2'] = $currlpu->name2;                
            }
            else
            {
                throw new Exception('Ошибка авторизации на сервере.');
            }
        }

        private function parse_authentification_responce($xmlfile)
        {
            // XML с данными расписания
            $dom1 = new DomDocument();
            $dom1->loadXML(html_entity_decode($xmlfile));
            $authentification = $dom1->getElementsByTagName('authentification');
            foreach($authentification as $authentification_item)
            {
                $this->sessionid = $authentification_item->getAttribute('guid');
                $this->user_lpu = $authentification_item->getAttribute('lpu');
                $_SESSION['sessionid'] = $this->sessionid; 
                $_SESSION['server_login'] = $this->login; 
                $_SESSION['server_password'] = $this->password; 
                $_SESSION['user_lpu'] = $this->user_lpu;
                // $this->login = $_SESSION['server_login'];
                return true;
            }
            return false;
        }

        // Схемы сайта
        function Schemas()
        {
            $ret = Array();
            // файл схемы для текущего сайта
            $ret[] = Array('file'=>dirname(__FILE__).'/schema.xml', 'name' => 'Схема текущего сайта');
            return $ret;
        }

        // Вызывается при обновлении сайта
        function Setup()
        {
            global $mikron;
            // добавление пункта меню в главное меню админки
            // $mikron->addmenu("Сайт/Автоматизация/Проверить письма", "/mikron/sites/7chances2/email.php");
            // $mikron->addmenu("Сайт/Автоматизация/Проверить купоны", "/mikron/sites/7chances2/sms_billing.php");
        }


        function PreSave($entity)
        {
            global $mikron;
            switch(get_class($entity))
            {
                case 'T_PERSON':
                    if(!is_null($entity->uniqueid->value))
                    {
                        return true;
                    }
                    $with_ajax = isset($_REQUEST['ajax']);
                    if($with_ajax)
                    {
                        $with_ajax = ($_REQUEST['ajax'] == 'addperson');
                    }
                    try
                    {
                        $ret = $this->ServerPersonExistsOnServer($entity);
                        $entity->cabinet->value = $mikron->Users->CurrentUser()->id();
                        $entity->Save();
                        if($with_ajax)
                        {
                            $out = ob_get_clean();
                            header("HTTP/1.0 200 Карточка успешно добавлена в картотеку.");
                            exit;
                        }
                        else
                        {
                            ?>Карточка успешно добавлена в картотеку.<?php
                        }
                        return false;
                    }
                    catch(Exception $ex)
                    {
                        if($with_ajax)
                        {
                            $out = ob_get_clean();
                            header('HTTP/1.0 500 '.$ex->getMessage());
                            echo $ex->getMessage();
                            exit;
                        }
                        else
                        {
                            $out = ob_get_clean();
                            header('HTTP/1.0 500 '.$ex->getMessage());
                            header("Location: /?addpeople&error=notfound");
                            exit;
                        }
                    }
                    break;
                default:
                    return true;
            }
        }

        function ServerPersonExistsOnServer($person)
        {
            global $mikron;
            $omsseries = $person->omsseries->value;
            $omsnumber = $person->omsnumber->value;
            $birthday = $person->birthday->value;
            $lastname = $person->lastname->value;
            $firstname = $person->firstname->value;
            $fathername = $person->fathername->value;
            $cr = new Criteria();
            $cr->Add(new Criterion('LastName', $lastname));
            $cr->Add(new Criterion('FirstName', $firstname));
            $cr->Add(new Criterion('FatherName', $fathername));
            $cr->Add(new Criterion('omsseries', $omsseries));
            $cr->Add(new Criterion('omsnumber', $omsnumber));
            $p_count = (int)$mikron->EntityManager->QueryCount(get_class($person), null, $cr);
            if($p_count > 0)
            {
               throw new Exception("Карточка с такими данными уже
                присутствует в картотеке.");
            }
            $xml = CreateCheckPersonXML($omsseries, $omsnumber, $birthday, $lastname, $firstname, $fathername);           
            $buf = CallSoap("check_person", $xml);
            if(strlen(trim($buf)) < 1)
            {
                throw new Exception("Ошибка проверки на стороне сервера. Пожалуйста повторите попытку.");              
            }
            $dom1 = new DomDocument();
            $dom1->loadXML($buf);
            $check_person = $dom1->getElementsByTagName("check_person");
            foreach($check_person as $person_info)
            {
                $uniqueid = $person_info->getAttribute("guid");
                if(is_null($uniqueid) || ($uniqueid == ""))
                {
                    throw new Exception("Карточка с такими данными не числится в базе.");
                }
                $person->lastname->value = $person_info->getAttribute("lastname");
                $person->firstname->value = $person_info->getAttribute("firstname");
                $person->fathername->value = $person_info->getAttribute("fathername");
                $person->sex->value = $person_info->getAttribute("sex");
                $person->uniqueid->value = $uniqueid;
                break;
            }
            return false;
        }

        // Вызывается из процедуры $mikron->Page->StartBody();
        function main()
        {
            global $mikron;
            $mikron->Handlers->AddSaveHandler('PreSave', Array('T_PERSON'), $this);
        }
    }

    function LogOut()
    {
        global $mikron;
        if($mikron->Users->Logged())
        {
            ?><p>
            <a title="Завершение сеанса" class="redback"
            style="display: inline-block; " href="index.php?logout">Выйти</a>
            </p><?php
        }
    }

?>